// @ts-nocheck
//记录递归次数 只能通过元组没有其他方式

//如果没有达到开头的长度 就要记录找到了多少个元素//始终要计算结束位置，是否达到
type Slice<
  // 要截取的数组
  T extends any[],
  // 截取开始索引
  SIndex extends number,
  // 截取结束索引
  EIndex extends number = T["length"],
  // 记录当前遍历到的个数，达到 截取开始索引后长度不在变化 这样变化[...SA, null],
  SA extends any[] = [],
  // 记录当前遍历到的个数，达到截取结束索引后返回 这样变化[...EA, null]
  EA extends any[] = [],
  // 返回结果集
  F extends any[] = []
> = T extends [infer L, ...infer R]
  ? //  当前元素位置，是否达到截取元素开头
    SA["length"] extends SIndex
    ? //  当前元素位置，是否达到截取元素结尾
      EA["length"] extends EIndex
      ? [...F, L]
      : Slice<R, SIndex, EIndex, SA, [...EA, null], [...F, L]> // 达到要截取的部分逻辑
    : Slice<R, SIndex, EIndex, [...SA, null], [...EA, null], F> // 没有达到要截取的部分逻辑 Slice<T,1,3,[1],[1,2,3],[never,1,'2']>
  : T;
type A1 = Slice<[any, never, 1, "2", true, boolean], 0, 2>; // [any,never,1]                    从第0个位置开始，保留到第2个位置的元素类型
type A2 = Slice<[any, never, 1, "2", true, boolean], 1, 3>; // [never,1,'2']                    从第1个位置开始，保留到第3个位置的元素类型
type A3 = Slice<[any, never, 1, "2", true, boolean], 1, 2>; // [never,1]                        从第1个位置开始，保留到第2个位置的元素类型
type A4 = Slice<[any, never, 1, "2", true, boolean], 2>; // [1,'2',true,boolean]             从第2个位置开始，保留后面所有元素类型
type A5 = Slice<[any], 2>; // []                               从第2个位置开始，保留后面所有元素类型
type A6 = Slice<[], 0>; // []

export {};
